package main

import (
	"html/template"
	"log"
	"net/http"
)

// 前后端不分离的时候使用
// template 定义了数据驱动的文本输出，生成的html文件的模板在html/template包下面，模板属于插入值{{.var}}格式
// 也可以使用一些流程控制语句 判断if else、循环range
func main() {
	//请求处理函数
	f := func(resp http.ResponseWriter, req *http.Request) {
		t, err := template.ParseFiles("login.html")
		if err != nil {
			panic(err)
		}
		t.Execute(resp, "hello world")
	}
	http.HandleFunc("/tmpl", f)
	//设置监听端口，并监听，注意前面要有冒号 :
	err := http.ListenAndServe(":9999", nil)
	if err != nil {
		log.Fatal(err)
	}
}

//所有行的分隔符，空格等等空白都原样保留,对于要解析的内容，不要随意缩进、换行
/*{{23}} < {{45}} --->23 < 45
{{23}} < {{- 45}} --->23 <45
{{23 -}} < {{45}} --->23< 45
{{23 -}} < {{- 45}} ---> 23<45
去掉后空格xxxx -}},去掉前空格{{- xxx */
//模板注释{{- /* xxxx */ -}},注释行在替换的时候也会占用行，所以应该去除前缀和后缀空白，否则会多一空行

//管道符 | ,下面几种实例都会输出out
/*{{`"out"`}}<br>
{{printf "%q","out"}}<br>
{{"out" | printf "%q"}}<br>
{{printf "%q" (print "out" "put")}}<br>
{{"put" | printf "%s%s" "out" | printf "%q"}}<br>
{{"out" } printf "%s" | printf "%q"}<br>*/

//变量
/*
未定义过的变量
$var := pipeline
已定义过的变量
$var = pipeline
*/

//条件判断
/*{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}}  T0 {{end}}
{{if pipeline}} T1 {{else}}{{if pipeline}} T0 {{end}}{{end}}
pipeline为false的情况是各种数据对象的0值:数值0,指针或接口是nil,数组mslice,map或string则是len为0

运算符表达式
eq  ==
ne !=
lt <
le <=
gt >
ge >=
*/

//循环迭代
/*{{range pipeline}} T1 {{end}} 迭代对象的值为0值时，则range直接跳过，就是if一样
{{range pipeline}} T1 {{else}} T0 {{end}} 在迭代到0值时执行else语句
range可以迭代slice、数组、map或channel。迭代的时候，会设置"."为当前迭代的元素
*/
func tmpl(w http.ResponseWriter, r *http.Request) {
	t1, err := template.ParseFiles("login.html")
	if err != nil {
		panic(err)
	}
	s := []string{"我", "是", "你", "大", "页"}
	t1.Execute(w, s)
}

//with ... end
/*{{with pipeline}} T1 {{end}} 当pipeline 不为0值的时候,点"."设置为pipeline运算的值，否则跳过
{{with pipeline}} T1 {{else}} T0 {{end}} 当pipeline 为0值的时候，执行else语句模块,否则点"."设置为pipeline运算的值，并执行T1*/

//重点 嵌套
/*define可以直接在待解析内容中定义一个模板，这个模板会加入到common结构组中，并关联待关联名上
{{template "name"}}
{{template "name" pipeline}}
{{define "name"}}*/

/*
实例演示：
假如我们有一个header.html,footer.html和index.html,index包含header,footer
header.html
{{defline "header"}}

	<head>
		<title>{{. Title}}</title>
	</head>

{{end}}

footer.html
{{defline "footer"}}

	这是footer

{{end}}

login.html
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Document</title>
	</head>
	<body>
		{{template "header" .}}
		<h1>首页...</h1>
			{{template "footer"}}
	</body>

</html>
*/
func tmmp(w http.ResponseWriter, r *http.Request) {
	t, err := template.ParseFiles("templates/login.html", "templates/header.html", "templates/footer.html")
	if err != nil {
		panic(err)
	}
	t.Execute(w, t)
}
